home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / bb / src / textdsp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  11.0 KB  |  491 lines

  1. /*
  2.  
  3.         text display for 16 color graphic mode
  4.  
  5.                       1993.6.27 v1.0
  6.                       copyright Y.Ouchi
  7.  
  8.             input    *log    : log data
  9.                     logleng    : log length
  10.                     **title : title data
  11.                     *intext : log analize result
  12.                     *textno : display text no
  13.  
  14.             output    0  : all end
  15.                     1  : log save & quit
  16.                     2  : title mode switch
  17.                     3  : new file read
  18.                     4  : mode change
  19.  
  20. */
  21.  
  22. #include    <stdio.h>
  23. #include    <string.h>
  24. #include    <stdlib.h>
  25. #include    <jctype.h>
  26. #include    <time.h>
  27. #include    "egb.h"
  28. #include    "mos.h"
  29. #include    "snd.h"
  30. #include    "bb.h"
  31.  
  32.     /* 関数プロトタイプ宣言 */
  33. int        nextchek( );
  34.  
  35. extern    char    egbwork[];
  36. extern    char    moswork[];
  37. extern    void    linedsp(int, int, char *);
  38. extern    void    linedspv(int, int, char *, int, unsigned int, unsigned int);
  39. extern    void    linedspvl(int,int,char *,int,int,unsigned int,unsigned int);
  40. extern    void    box(int, int, int, int, int, int);
  41. extern    int        menuread(void);
  42. extern    int        mouse_in(int *, int *);
  43. extern    int        key_in(void);
  44. extern    int        pad_in(void);
  45. extern    int        crfindb(int, char *, int *, int *);
  46.  
  47. extern    int        max_text;
  48. extern    int        dispmode;
  49.  
  50. int textdsp(char *log,int logleng,char **title,
  51.                 struct logcontent *intext,short *disptext,int *textno)
  52. {
  53.     char    *nontitle={"no title"};
  54.     int        i,j,k,line,startp,leng,textleng,next_pos;
  55.     int        dispstartline,dispendline;
  56.     int        overlapline=1;
  57.     int        texthead;
  58.     struct    dspcont{
  59.                 short    pos;
  60.                 short    leng;
  61.             }    dsptext[500];
  62.     int        endcode=0;
  63.     int        contflag=1,textdispflag;
  64.     int        dispmakeflag;
  65.     int        back=0;
  66.     int        nowtext;
  67.     unsigned    char    *text;
  68.     char    footer[90]={"      lines       bytes"};
  69.     int        titleno;
  70.  
  71.     titleno=-2;
  72.  
  73.     while ( contflag ){
  74.  
  75.                     /* first display text search            */
  76.         for (i=*textno;i<max_text;i++){
  77.             if(intext->text[disptext[i]].text.id!=TITLE_ID) break;
  78.         }
  79.         *textno=i;
  80.         nowtext=disptext[i];
  81.         texthead=intext->text[nowtext].text.pos;
  82.  
  83.                     /* title display on header            */
  84.         if (titleno!=intext->text[nowtext].text.title_index){
  85.             EGB_writePage(egbwork,1);
  86.             box(0,16,639,34,TITLEBACK_COL,1);
  87.             EGB_color(egbwork, 0, TITLE_COL);
  88.             if (intext->text[nowtext].text.id == NOTITLE_TEXT_ID){
  89.                 linedspv(0,32,nontitle,1,TITLE_COL,TITLEBACK_COL);
  90.             }
  91.             else{
  92.                 if (intext->text[nowtext].text.title_index>=0){
  93.                     linedspv(0,32,
  94.                             title[intext->text[nowtext].text.title_index],
  95.                             1,TITLE_COL,TITLEBACK_COL);
  96.                 }
  97.                 else {
  98.                     linedspv(0,32,nontitle,1,TITLE_COL,TITLEBACK_COL);
  99.                 }
  100.             }
  101.             EGB_color(egbwork, 0, TEXT_COL);
  102.             EGB_writePage(egbwork,0);
  103.             titleno=intext->text[nowtext].text.title_index;
  104.         }
  105.  
  106.                     /* text display */
  107.                         /* display data make */
  108.         text=(unsigned char *)&log[(int)intext->text[nowtext].text.pos];
  109.         textleng=intext->text[nowtext].text.leng;
  110.         startp=leng=line=0;
  111.  
  112.         dispmakeflag=1;
  113.         while(dispmakeflag){
  114.             i=crfindb(textleng-startp,(char *)&text[startp],&leng,&next_pos);
  115.             if (i>0){
  116.                 if (leng>80){
  117.                     do {
  118.                         k=0;
  119.                         while(k<80){
  120.                             if (iskanji(text[startp+k])) k=k+2;
  121.                             else k=k+1;
  122.                         }
  123.                         if (k==81) k=79;
  124.                         dsptext[line].pos=startp;
  125.                         dsptext[line].leng=k;
  126.                         leng=leng-k;
  127.                         startp=startp+k;
  128.                         next_pos=next_pos-k;
  129.                         line=line+1;
  130.                         if (line>500) break;
  131.                     } while(leng>80);
  132.                 }
  133.                 if (line>500) break;
  134.                 dsptext[line].pos=startp;
  135.                 dsptext[line].leng=leng;
  136.                 line=line+1;
  137.                 if (line>500) break;
  138.                 if (leng==80){
  139.                     dsptext[line].pos=0x00;
  140.                     dsptext[line].leng=0x00;
  141.                     line=line+1;
  142.                     if (line>500) break;
  143.                 }
  144.                 for(j=1;j<i;j++){
  145.                     dsptext[line].pos=0x00;
  146.                     dsptext[line].leng=0x00;
  147.                     line=line+1;
  148.                     if (line>500) break;
  149.                 }
  150.                 if (next_pos<=0) dispmakeflag=0;
  151.                 else startp=startp+next_pos;
  152.             }
  153.             else{
  154.                 if (leng>0){
  155.                     dsptext[line].pos=startp;
  156.                     dsptext[line].leng=leng;
  157.                     line=line+1;
  158.                 }
  159.                 dispmakeflag=0;
  160.             }
  161.         }
  162.         for(i=line-1;i>0;i--) if (dsptext[i].leng!=0x00) break;
  163.         line=i+1;
  164.  
  165.                         /* footer write (line no & size) */
  166.         j=line;
  167.         for(i=4;i>0;i--){
  168.             if (j>0){
  169.                 footer[i]=j%10+0x30;
  170.                 j=j/10;
  171.             }
  172.             else footer[i]=0x20;
  173.         }
  174.         j=(int)intext->text[nowtext].text.leng;
  175.         for(i=16;i>11;i--){
  176.             if (j>0){
  177.                 footer[i]=j%10+0x30;
  178.                 j=j/10;
  179.             }
  180.             else footer[i]=0x20;
  181.         }
  182.         EGB_writePage(egbwork,1);
  183.         EGB_color(egbwork, 0, TITLE_COL);
  184.         linedsp(0,477,footer);
  185.         EGB_writePage(egbwork,0);
  186.         EGB_color(egbwork, 0, TEXT_COL);
  187.  
  188.                         /* text display */
  189.         dispstartline=0;
  190.         if (back==1){
  191.             while (dispstartline+TEXT_LINE_NO<line){
  192.                 dispstartline=dispstartline+TEXT_LINE_NO-overlapline;
  193.             }
  194.         }
  195.         textdispflag=1;
  196.         while ( textdispflag ){
  197.             EGB_clearScreen(egbwork);
  198.             dispendline = dispstartline + TEXT_LINE_NO ;
  199.             if (dispendline > line) dispendline=line;
  200.             for (i=0;i<dispendline-dispstartline;i++){
  201.                 linedspvl(0,i*17+51,
  202.                             &(log[texthead+dsptext[dispstartline+i].pos]),
  203.                             dsptext[dispstartline+i].leng,0,TEXT_COL,BACK_COL);
  204.             }
  205.             switch ( nextchek() ){
  206.                 case 0 :    /* all end */
  207.                     endcode=0;
  208.                     textdispflag = 0 ;
  209.                     contflag=0;
  210.                     break ;
  211.                 case 1 :    /* next page */
  212.                     if (dispstartline+TEXT_LINE_NO >= line) {
  213.                         for (i=*textno+1;i<max_text;i++){
  214.                             if (intext->text[disptext[i]].text.id!=TITLE_ID)
  215.                                             break;
  216.                         }
  217.                         if (i < max_text){
  218.                             *textno=i;
  219.                             back=0;
  220.                         }
  221.                         else back=1;
  222.                         textdispflag = 0 ;
  223.                     }
  224.                     else dispstartline=dispstartline+TEXT_LINE_NO-overlapline;
  225.                     break ;
  226.                 case 2 :    /* previous page */
  227.                     if (dispstartline-TEXT_LINE_NO+overlapline < 0){
  228.                         for (i=*textno-1;i>=0;i--){
  229.                             if (intext->text[disptext[i]].text.id!=TITLE_ID)
  230.                                         break;
  231.                         }
  232.                         if (i>=0){
  233.                             *textno=i;
  234.                             back=1;
  235.                         }
  236.                         else back=0;
  237.                         textdispflag = 0 ;
  238.                     }
  239.                     else dispstartline=dispstartline-TEXT_LINE_NO+overlapline;
  240.                     break ;
  241.                 case 3 :    /* next text */
  242.                     for (i=*textno+1;i<max_text;i++){
  243.                         if (intext->text[disptext[i]].text.id!=TITLE_ID) break;
  244.                     }
  245.                     if (i < max_text){
  246.                         *textno=i;
  247.                         back=0;
  248.                     }
  249.                     textdispflag = 0 ;
  250.                     break ;
  251.                 case 4 :    /* previous text */
  252.                     for (i=*textno-1;i>=0;i--){
  253.                         if (intext->text[disptext[i]].text.id!=TITLE_ID) break;
  254.                     }
  255.                     if (i>=0){
  256.                         *textno=i;
  257.                     }
  258.                     back=0;
  259.                     textdispflag = 0 ;
  260.                     break ;
  261.                 case 5 :    /* next title */
  262.                     for (i=*textno+1;i<max_text-1;i++){
  263.                         if (intext->text[disptext[i]].text.id==TITLE_ID) break;
  264.                     }
  265.                     for (j=i+1;j<max_text;j++){
  266.                         if (intext->text[disptext[j]].text.id!=TITLE_ID){
  267.                             *textno=j;
  268.                             break;
  269.                         }
  270.                     }
  271.                     back=0;
  272.                     textdispflag = 0 ;
  273.                     break ;
  274.                 case 6 :    /* previous title */
  275.                     for (i=*textno-2;i>=0;i--){
  276.                         if (intext->text[disptext[i]].text.id==TITLE_ID) break;
  277.                     }
  278.                     for (j=i+1;j<max_text;j++){
  279.                         if (intext->text[disptext[j]].text.id!=TITLE_ID){
  280.                             *textno=j;
  281.                             break;
  282.                         }
  283.                     }
  284.                     back=0;
  285.                     textdispflag = 0 ;
  286.                     break ;
  287.                 case 7 :    /* top text */
  288.                     *textno=0;
  289.                     back=0;
  290.                     textdispflag = 0 ;
  291.                     break ;
  292.                 case 8 :    /* last text */
  293.                     *textno=max_text-1;
  294.                     back=0;
  295.                     textdispflag = 0 ;
  296.                     break ;
  297.                 case 9 :    /* log save & quit */
  298.                     endcode = 1;
  299.                     contflag=0;
  300.                     textdispflag = 0 ;
  301.                     break ;
  302.                 case 10 :    /* title mode switch */
  303.                     endcode = 2;
  304.                     contflag=0;
  305.                     textdispflag = 0 ;
  306.                     break ;
  307.                 case 11 :    /* new file select */
  308.                     endcode = 3;
  309.                     contflag=0;
  310.                     textdispflag = 0 ;
  311.                     break ;
  312.                 case 12 :    /* mode change */
  313.                     endcode = 4;
  314.                     contflag=0;
  315.                     textdispflag = 0 ;
  316.                     break ;
  317.                 case 13 :    /* console */
  318.                     endcode = 5;
  319.                     contflag=0;
  320.                     textdispflag = 0 ;
  321.                     break ;
  322.                 case 14 :    /* conf title mode */
  323.                     endcode = 6;
  324.                     contflag=0;
  325.                     textdispflag = 0 ;
  326.                     break ;
  327.                 default :
  328.                     break ;
  329.             }
  330.         }
  331.         EGB_writePage(egbwork,1);
  332.         box(0,462,190,479,TITLEBACK_COL,1);
  333.         EGB_writePage(egbwork,0);
  334.         EGB_color(egbwork, 0, TEXT_COL);
  335.  
  336.     }
  337.  
  338.     return(endcode);
  339.  
  340. }
  341.  
  342.  
  343. /*
  344.         next action check
  345.                       1993.4.10 v.00
  346.                       1993.4.17 v.01    menu made
  347.                       1993.4.24 v.02    pad add
  348.                       copyright Y.Ouchi
  349.  
  350.             input    non
  351.  
  352.             output    0  : all end
  353.                     1  : next page
  354.                     2  : previous page
  355.                     3  : next text
  356.                     4  : previous text
  357.                     5  : next title
  358.                     6  : previous title
  359.                     7  : top text
  360.                     8  : last text
  361.                     9  : log save & quit
  362.                     10  : title mode switch
  363.                     11  : new file select
  364.                     12  : mode change
  365.  
  366.                     0 & 4-12 menuread return
  367. */
  368.  
  369. int nextchek( )
  370. {
  371.     int        i,x,y;
  372.     int        endcode=0;
  373.     time_t    now;
  374.     char    nowchar[30];
  375.     char    oldmin=0x00;
  376.     int        contflag;
  377.  
  378.     contflag=1;
  379.     while ( contflag ) {
  380.  
  381.                     /* mouse status check */
  382.         switch (mouse_in(&x,&y)){
  383.             case 0 : break;        /* no input */
  384.             case 1 :            /* right bottan */
  385.                 endcode=2;
  386.                 contflag=0;
  387.                 break;
  388.             case 2 :            /* left bottan  */
  389.                 endcode=1;
  390.                 contflag=0;
  391.                 break;
  392.             case 3 :            /* both bottan  */
  393.                 endcode=menuread( );
  394.                 contflag=0;
  395.                 break;
  396.             default : break;
  397.         }
  398.  
  399.                     /* key board status check */
  400.         switch (key_in()){
  401.             case 0 : break;        /* no input */
  402.             case 1 :            /* ESC key  */
  403.                 endcode=menuread( );
  404.                 contflag=0;
  405.                 break;
  406.             case 2 :            /* down key */
  407.                 endcode=1;
  408.                 contflag=0;
  409.                 break;
  410.             case 3 :            /* up key   */
  411.                 endcode=2;
  412.                 contflag=0;
  413.                 break;
  414.             case 4 :            /* right key */
  415.                 endcode=3;
  416.                 contflag=0;
  417.                 break;
  418.             case 5 :            /* left key  */
  419.                 endcode=4;
  420.                 contflag=0;
  421.                 break;
  422.             case 6 :            /* CR key    */
  423.                 endcode=1;
  424.                 contflag=0;
  425.                 break;
  426.             case 7 :            /* 取消 key  */
  427.                 endcode=2;
  428.                 contflag=0;
  429.                 break;
  430.             default : break;
  431.         }
  432.  
  433.                     /* joy pad status check */
  434.         switch (pad_in()){
  435.             case 0 : break;        /* no input  */
  436.             case 1 :            /* A trigger */
  437.                 endcode=1;
  438.                 contflag=0;
  439.                 break;
  440.             case 2 :            /* B trigger */
  441.                 endcode=2;
  442.                 contflag=0;
  443.                 break;
  444.             case 3 :            /* down key  */
  445.                 endcode=1;
  446.                 contflag=0;
  447.                 break;
  448.             case 4 :            /* up key    */
  449.                 endcode=2;
  450.                 contflag=0;
  451.                 break;
  452.             case 5 :            /* right key */
  453.                 endcode=3;
  454.                 contflag=0;
  455.                 break;
  456.             case 6 :            /* left key   */
  457.                 endcode=4;
  458.                 contflag=0;
  459.                 break;
  460.             case 7 :            /* RUN key    */
  461.                 endcode=menuread( );
  462.                 contflag=0;
  463.                 break;
  464.             case 8 :            /* SELECT key */
  465.                 endcode=menuread( );
  466.                 contflag=0;
  467.                 break;
  468.             default : break;
  469.         }
  470.  
  471.         now=time(NULL);
  472.         strncpy(nowchar,ctime(&now),24);
  473.         for(i=16;i<21;i++) nowchar[i]=nowchar[i+3];
  474.         nowchar[21]=0x00;
  475.         if (oldmin!=nowchar[15]){
  476.             EGB_writePage(egbwork,1);
  477.             box(460,462,639,479,TITLEBACK_COL,1);
  478.             EGB_color(egbwork, 0, TIME_COL);
  479.             linedsp(460,478,nowchar);
  480.             EGB_writePage(egbwork,0);
  481.             EGB_color(egbwork, 0, TEXT_COL);
  482.             oldmin=nowchar[15];
  483.         }
  484.  
  485.     }
  486.     EGB_color(egbwork, 0, TEXT_COL);
  487.     EGB_color(egbwork, 1, BACK_COL);
  488.     return ( endcode );
  489. }
  490.  
  491.